package newApi;

import java.util.*;
import java.util.stream.Stream;

public class StreamTest2 {
    public static void main(String[] args) {
        /**
         * List扁平化
         */
        Stream<List<Integer>> stream = Stream.of(Arrays.asList(1), Arrays.asList(2, 3), Arrays.asList(4, 5, 6));
        stream.flatMap(theList -> theList.stream()).forEach(System.out::println);
        System.out.println("----");

        /**
         * findFirst和findAny
         */
        Stream<String> stringStream = Stream.generate(UUID.randomUUID()::toString);
        Stream<List<Integer>> generate = Stream.generate(() -> Arrays.asList(1, 2, 3));
        Optional<String> first = stringStream.findFirst();
        Optional<List<Integer>> any = generate.findAny();
        // 对于optional操作一定要先判断，规避NPE
        first.ifPresent(System.out::println);
        any.ifPresent(System.out::println);
        System.out.println("----");

        /**
         * 无限的串行流
         * 传入一个种子数1，然后不断地对该种子数执行item -> item + 2操作
         * 如果不使用limit限制，将不断的一边操作，一边输出，limit限制操作次数
         * 注意limit一定要紧跟着iterate使用，否则始终会有一个流无法终止
         */
        Stream.iterate(1, item -> item + 2).limit(6).forEach(System.out::println);
        System.out.println("----");
        // 注意limit一定要紧跟着iterate使用，否则始终会有一个流无法终止
//        Stream.iterate(1, item -> (item + 1) % 2).distinct().limit(6).forEach(System.out::println);

        /**
         * 找出该流中大于2的元素，然后将每个元素乘以2，然后忽略掉流中的前两个元素，然后在取出流中的前两个元素，最后求出流中元素的总和
         */
        OptionalInt reduce = Stream.iterate(1, item -> item + 2)
                .limit(6)
                .filter(item -> item > 2)
                .mapToInt(item -> item * 2) // 使用mapToInt避免自动装箱
                .skip(2)
                .limit(2)
                .reduce((item1, item2) -> item1 + item2); // .sum不会发送NPE所以返回的不会被Optional包装、.max和.min会返回Optional
        reduce.ifPresent(System.out::println);
        System.out.println("----");

        /**
         * 找出该流中大于2的元素，然后将每个元素乘以2，然后忽略掉流中的前两个元素，然后在取出流中的前3个元素，求总和、最大、最小
         */
        IntSummaryStatistics intSummaryStatistics = Stream.iterate(1, item -> item + 2)
                .limit(6)
                .filter(item -> item > 2)
                .mapToInt(item -> item * 2) // 使用mapToInt避免自动装箱
                .skip(2)
                .limit(3)
                .summaryStatistics();
        System.out.println("最大：" + intSummaryStatistics.getMax());
        System.out.println("最小：" + intSummaryStatistics.getMin());
        System.out.println("总和：" + intSummaryStatistics.getSum());
        System.out.println("----");
    }
}
